package cn.tedu.wms.passport.service.impl;

import cn.tedu.wms.passport.ex.ServiceException;
import cn.tedu.wms.passport.mapper.InputOutputMapper;
import cn.tedu.wms.passport.pojo.dto.InputOutputAddNewDTO;
import cn.tedu.wms.passport.pojo.dto.InputOutputUpdateDTO;
import cn.tedu.wms.passport.pojo.entity.InputOutput;
import cn.tedu.wms.passport.pojo.entity.InputOutput;
import cn.tedu.wms.passport.pojo.vo.InputOutputListItemVO;
import cn.tedu.wms.passport.pojo.vo.InputOutputStandardVO;
import cn.tedu.wms.passport.pojo.vo.InputOutputStandardVO;
import cn.tedu.wms.passport.service.IInputOutputService;
import cn.tedu.wms.passport.web.ServiceCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
/**
 * 处理库存数据的业务实现类
 *
 * @author 刘哲兮
 * @version 0.0.1
 */
@Slf4j
@Service
public class InputOutputServiceImpl implements IInputOutputService {
    @Autowired
    InputOutputMapper inputOutputMapper;

    public InputOutputServiceImpl() {
        log.debug("创建业务对象：InputOutputServiceImpl");
    }
    @Override
    public void addNew(InputOutputAddNewDTO inputOutputAddNewDTO) {
        log.debug("开始处理【添加出入库】的业务，参数：{}", inputOutputAddNewDTO);
        // 从参数inputOutputAddNewDTO中获取尝试添加的产品id
        Long id = inputOutputAddNewDTO.getId();
        // 检查此出入库信息名称是否已经存在：调用Mapper对象的countById()方法，判断结果是否不为0
        int count = inputOutputMapper.countById(id);
        if (count != 0) {
            // 是：id已存在，不允许创建，抛出异常
            String message = "添加出入库信息失败，尝试添加的出入库信息名称已经被占用！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_CONFLICT, message);
        }

        // 创建InputOutput对象
        InputOutput inputoutput = new InputOutput();
        // 将参数DTO中的数据复制到InputOutput对象中
        BeanUtils.copyProperties(inputOutputAddNewDTO, inputoutput);
        log.debug("即将插入出入库信息数据：{}", inputoutput);
        // 调用Mapper对象的insert()方法，插入出入库信息数据
        inputOutputMapper.insert(inputoutput);
    }

    @Override
    public void delete(Long id) {
        log.debug("开始处理【删除出入库】的业务，参数：{}", id);
        // 调用Mapper对象的getDetailsById()方法执行查询
        InputOutputStandardVO queryResult = inputOutputMapper.getStandardById(id);
        // 判断查询结果是否为null
        if (queryResult == null) {
            // 是：无此id对应的数据，抛出异常
            String message = "删除出入库失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        // 调用Mapper对象的deleteById()方法执行删除
        log.debug("即将删除出入库数据……");
        inputOutputMapper.deleteById(id);
        log.debug("删除出入库，完成！");
    }

    @Override
    public void updateInfoById(Long id, InputOutputUpdateDTO inputOutputUpdateDTO) {
        log.debug("开始处理【修改出入库详情】的业务，参数：{}", id);
        // 调用Mapper对象的getDetailsById()方法执行查询
        InputOutputStandardVO queryResult = inputOutputMapper.getStandardById(id);
        // 判断查询结果是否为null
        if (queryResult == null) {
            // 是：此id对应的数据不存在，则抛出异常(ERR_NOT_FOUND)
            String message = "修改出入库详情失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        InputOutput inputoutput = new InputOutput();
        BeanUtils.copyProperties(inputOutputUpdateDTO, inputoutput);
        inputoutput.setId(id);

        // 修改数据
        log.debug("即将修改数据：{}", inputoutput);
        int rows = inputOutputMapper.updateById(inputoutput);
        if (rows != 1) {
            String message = "修改出入库详情失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
    }

    @Override
    public InputOutputStandardVO getStandardById(Long id) {
        log.debug("开始处理【根据id查询出入库详情】的业务");
        InputOutputStandardVO inputoutput = inputOutputMapper.getStandardById(id);
        if (inputoutput == null) {
            String message = "获取出入库详情失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        return inputoutput;
 
    }

    @Override
    public List<InputOutputListItemVO> list() {
        log.debug("开始处理【查询出入库列表】的业务");
        return inputOutputMapper.list();
    }
}
